package opf5.entities.calificaciones;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import opf5.entities.dominio.Calificacion;
import opf5.entities.dominio.Jugador;
import opf5.entities.dominio.Partido;

public class CalculadorPromedios {
	public static double calcularPromedioTotal(Jugador j) {
		List<Calificacion> calificaciones = j.getCalificaciones();
		if (calificaciones.size() == 0)
			return 0;
		
		double suma = 0;
		for (Calificacion c : calificaciones) {
			suma += c.getNota();
		}
		
		return suma / j.getCalificaciones().size();
	}

	public static double calcularPromedioUltimoPartido(Jugador j) {
		return calcularPromedioUltimosNPartidos(j, 1);
	}

	public static double calcularPromedioUltimosNPartidos(Jugador j, int n) {
		List<Calificacion> calificaciones = j.getCalificaciones();
		if (calificaciones.size() == 0)
			return 0;
		
		List<Partido> partidos = getPartidosDeCalificaciones(calificaciones);
		
		Collections.sort(partidos, new Comparator<Partido>() {
			@Override
			public int compare(Partido partido1, Partido partido2) {
				if (partido1.getFechaPartido().esAnteriorA(partido2.getFechaPartido()))
					return 1;				
				
				if (partido2.getFechaPartido().esAnteriorA(partido1.getFechaPartido()))
					return -1;
				
				return 0;
			}
		});
		
		List<Partido> ultimosNPartidos = new ArrayList<Partido>();
		int i = 0;
		
		for (Partido p : partidos) {
			i ++;
			
			ultimosNPartidos.add(p);
			
			if (i == n)
				break;
		}
		
		double suma = 0;
		int cantidadCalificaciones = 0;
		for (Calificacion c : calificaciones) {
			if (ultimosNPartidos.contains(c.getPartido())) {
				suma += c.getNota();
				cantidadCalificaciones ++;
			}
		}
		
		return suma / cantidadCalificaciones;
	}

	private static List<Partido> getPartidosDeCalificaciones(
			List<Calificacion> calificaciones) {
		List<Partido> partidos = new ArrayList<Partido>();
		
		for (Calificacion c : calificaciones) {
			if (! partidos.contains(c.getPartido())) {
				partidos.add(c.getPartido());
			}
		}
		
		return partidos;
		
	}
}
